너는 딥러닝, 인공신경망, 자연어처리,
텍스트 감성분석, 이진분류, TensorFlow·Keras,
모델 성능평가, 데이터 시각화 및 Python 코딩을 전문적으로 수행하는
데이터 분석가이자 대학 교육 전문가이다.

TensorFlow·Keras에서 제공하는 IMDB 영화 리뷰 데이터를 이용하여
영화 리뷰를 긍정과 부정으로 분류하는
완전연결 심층신경망(DNN) 분석을 수행하여라.

본 실습은 첨부 교재의 기본흐름을 유지하면서
데이터 구조 확인, 리뷰 디코딩, 멀티-핫 벡터화,
신경망 학습, 과적합 진단, 시험성능 평가,
오분류 리뷰 분석 및 모델 개선까지 수행한다.

────────────────────────────────────
[가장 중요한 실행 원칙]
────────────────────────────────────

- 개념만 설명하거나 Python 코드만 작성하고 종료하지 마라.
- 반드시 Python 코드를 실제 Python 실행환경에서 실행하여라.
- 실제 실행으로 산출된 수치, 표 및 그래프를 확인한 후 해석하여라.
- Accuracy, Loss, 혼동행렬, ROC-AUC, F1-score 및 예측확률을
  임의로 만들거나 예시값으로 작성하지 마라.
- 코드 오류가 발생하면 원인을 확인하고 수정한 뒤 다시 실행하여라.
- 모든 최종 결론은 실제 Python 실행결과를 근거로 작성하여라.
- 시험자료는 모델구조, Epoch 또는 임계값 선택에 사용하지 마라.
- 훈련자료에서 검증자료를 별도로 구성하여라.
- 검증자료는 훈련자료와 클래스 비율이 유사하도록 분리하여라.
- 훈련 Accuracy가 시험 Accuracy보다 높다는 이유만으로
  과적합을 단정하지 마라.
- 과적합은 훈련·검증 Loss와 Accuracy의 변화로 판단하여라.
- IMDB 리뷰의 정수 인덱스 리스트를
  원-핫 인코딩이라고 부르지 말고
  여러 단어 위치가 동시에 1이 되는 멀티-핫 인코딩 또는
  Binary Bag-of-Words라고 설명하여라.
- `train_data[0]`을 항상 긍정 리뷰라고 설명하지 마라.
  실제 레이블을 함께 확인하여라.
- import 방식은 `tensorflow.keras`로 통일하여라.
- 난수 seed를 고정하여 재현성을 확보하여라.
- 텍스트 순서정보를 잃는 Bag-of-Words 방식의 한계를 설명하여라.

────────────────────────────────────
1. 분석 목적
────────────────────────────────────

본 분석의 목적은 다음과 같다.

1. IMDB 영화 리뷰 데이터의 구조를 이해한다.
2. 정수 인덱스로 표현된 리뷰를 실제 영어 문장으로 복원한다.
3. 가변 길이 텍스트를 고정 길이 벡터로 변환한다.
4. 긍정과 부정의 이진분류 신경망을 구축한다.
5. ReLU와 Sigmoid 활성화 함수의 역할을 이해한다.
6. Binary Cross-Entropy 손실함수의 의미를 이해한다.
7. 훈련·검증 손실곡선을 이용하여 과적합 시점을 확인한다.
8. 시험자료에서 Accuracy, Precision, Recall, F1 및 ROC-AUC를 평가한다.
9. 높은 확률로 오분류된 리뷰와 불확실한 리뷰를 분석한다.
10. 은닉층 수, 은닉노드 수, Dropout 및 L2 정규화 효과를 비교한다.
11. 기본 Bag-of-Words DNN과 Embedding 기반 모델을 비교한다.
12. 새로운 리뷰의 긍정확률을 예측한다.

────────────────────────────────────
2. 첨부 교재의 기본구조
────────────────────────────────────

첨부 교재의 기본 분석흐름은 다음과 같다.

- IMDB 데이터 불러오기
- 훈련 리뷰 25,000개
- 시험 리뷰 25,000개
- 긍정 50%, 부정 50%
- 가장 자주 등장하는 10,000개 단어만 사용
- 정수 인덱스 리뷰를 실제 단어로 복원
- 리뷰를 10,000차원 벡터로 변환
- Dense 16 + ReLU
- Dense 16 + ReLU
- Dense 1 + Sigmoid
- RMSprop Optimizer
- Binary Cross-Entropy Loss
- 훈련자료 15,000개
- 검증자료 10,000개
- 20 Epoch 학습
- 훈련·검증 Loss와 Accuracy 확인
- 약 4 Epoch 이후 과적합 확인
- 전체 훈련자료로 4 Epoch 재학습
- 시험 정확도 평가
- 긍정확률 예측

Python 실습에서는 위 흐름을 실제로 재현하고,
다음 분석을 추가하여라.

- 클래스 분포
- 리뷰 길이 분포
- 멀티-핫 희소도
- 혼동행렬
- Precision·Recall·F1
- ROC Curve
- PR Curve
- 최적 임계값
- 오분류 리뷰
- 예측 불확실성
- Early Stopping
- Dropout
- L2 정규화
- 은닉층 구조 비교
- Embedding 기반 모델 비교

────────────────────────────────────
3. 실행환경 확인
────────────────────────────────────

Python으로 다음을 실제 출력하여라.

- Python 버전
- TensorFlow 버전
- Keras 버전
- NumPy 버전
- scikit-learn 버전
- GPU 사용 가능 여부
- 사용 가능한 GPU 장치

다음 방식으로 import를 통일하여라.

```python
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf

from tensorflow import keras
from tensorflow.keras import layers

난수 seed:

SEED = 42

random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)

GPU 환경에서는 완전히 동일한 결과가 재현되지 않을 수 있음을 설명하여라.

────────────────────────────────────
4. IMDB 데이터 불러오기
────────────────────────────────────

다음 코드를 사용하여라.

from tensorflow.keras.datasets import imdb

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(
    num_words=10000
)

다음을 실제 출력하여라.

train_data 길이
train_labels 길이
test_data 길이
test_labels 길이
첫 번째 리뷰의 정수 시퀀스
첫 번째 리뷰의 레이블
두 번째 리뷰의 정수 시퀀스
두 번째 리뷰의 레이블
클래스별 표본 수
클래스별 비율
가장 큰 단어 인덱스
가장 작은 단어 인덱스

다음을 정확하게 설명하여라.

train_data[0]은 첫 번째 훈련 리뷰이다.
train_labels[0]이 1이면 긍정, 0이면 부정이다.
train_data[0] 자체가 항상 긍정 리뷰를 의미하지 않는다.
test_data는 시험자료이며 학습자료가 아니다.
num_words=10000은 가장 자주 등장하는 상위 10,000개 단어만 사용한다는 의미이다.

────────────────────────────────────
5. 리뷰 길이 분석
────────────────────────────────────

각 리뷰의 길이를 계산하여라.

train_lengths = np.array([len(review) for review in train_data])
test_lengths = np.array([len(review) for review in test_data])

다음을 실제 계산하여라.

평균 리뷰 길이
중앙값
최솟값
최댓값
표준편차
25%, 50%, 75%, 90%, 95%, 99% 분위수
긍정 리뷰 평균 길이
부정 리뷰 평균 길이

다음 그래프를 작성하여라.

전체 리뷰 길이 Histogram
긍정·부정별 리뷰 길이 Histogram
긍정·부정별 Boxplot
로그축 리뷰 길이 분포

다음을 해석하여라.

리뷰 길이 차이가 큰가?
매우 긴 리뷰가 있는가?
긍정·부정 리뷰의 길이 분포가 다른가?
리뷰 길이가 감성분류에 영향을 줄 가능성이 있는가?

상관관계를 인과관계로 해석하지 마라.

────────────────────────────────────
6. 정수 인덱스 리뷰 복원
────────────────────────────────────

다음 코드를 사용하여 리뷰를 실제 영어 단어로 복원하여라.

word_index = imdb.get_word_index()

reverse_word_index = {
    value: key for key, value in word_index.items()
}

def decode_review(sequence):
    return " ".join(
        reverse_word_index.get(index - 3, "?")
        for index in sequence
    )

0, 1, 2는 다음 용도로 예약되어 있음을 설명하여라.

Padding
Start of Sequence
Unknown Word

다음 리뷰를 실제로 복원하여라.

첫 번째 훈련 리뷰
두 번째 훈련 리뷰
임의의 긍정 리뷰 3개
임의의 부정 리뷰 3개
가장 긴 리뷰 1개
가장 짧은 리뷰 1개

각 리뷰에 실제 레이블을 함께 표시하여라.

디코딩된 문장에는 구두점과 대소문자가 완전하게 복원되지 않을 수 있음을 설명하여라.

────────────────────────────────────
7. 멀티-핫 벡터화
────────────────────────────────────

각 리뷰는 길이가 서로 다른 정수 시퀀스이므로
Dense 신경망 입력을 위해 고정된 10,000차원 벡터로 변환하여라.

다음 함수를 사용하여라.

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros(
        (len(sequences), dimension),
        dtype="float32"
    )

    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.0

    return results

벡터화:

x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

y_train = np.asarray(train_labels).astype("float32")
y_test = np.asarray(test_labels).astype("float32")

다음을 실제 출력하여라.

x_train shape
x_test shape
y_train shape
y_test shape
첫 번째 리뷰 벡터의 1 개수
첫 번째 리뷰의 고유 단어 수
전체 행렬의 1 비율
전체 행렬의 0 비율
메모리 사용량

이 표현은 다음과 같이 설명하여라.

하나의 리뷰에 여러 단어가 포함되므로 여러 위치가 1이다.
따라서 One-hot Encoding보다 Multi-hot Encoding이 정확하다.
단어의 등장 여부만 표현한다.
단어 순서와 반복 횟수는 반영하지 않는다.
Binary Bag-of-Words 표현이다.

────────────────────────────────────
8. 멀티-핫 방식의 한계
────────────────────────────────────

다음을 설명하여라.

장점:

구현이 간단함
계산이 빠름
Dense 신경망에 바로 입력 가능
텍스트 분류 입문에 적절함

한계:

단어 순서 손실
문장 구조 손실
동일 단어 반복횟수 손실
부정어와 문맥을 충분히 반영하지 못함
10,000차원의 희소 벡터 필요
메모리 사용량 증가

예:

This movie is good.
This movie is not good.

두 문장은 멀티-핫 표현에서 공통 단어가 많으므로
문맥 차이를 충분히 표현하기 어려울 수 있음을 설명하여라.

────────────────────────────────────
9. 훈련·검증·시험자료 구성
────────────────────────────────────

시험자료 25,000개는 최종평가용으로 유지하여라.

훈련자료 25,000개에서 검증자료 10,000개를 분리하여라.

교재 재현방식:

x_val = x_train[:10000]
partial_x_train = x_train[10000:]

y_val = y_train[:10000]
partial_y_train = y_train[10000:]

확장 실습에서는 다음 층화분할을 사용하여라.

from sklearn.model_selection import train_test_split

partial_x_train, x_val, partial_y_train, y_val = train_test_split(
    x_train,
    y_train,
    test_size=10000,
    stratify=y_train,
    random_state=42
)

다음을 실제 출력하여라.

부분 훈련자료 수
검증자료 수
시험자료 수
각 자료의 긍정 수
각 자료의 부정 수
각 자료의 긍정 비율

교재방식과 층화분할 방식의 차이를 설명하여라.

────────────────────────────────────
10. DNN 이진분류 기본개념
────────────────────────────────────

다음을 학생 수준에 맞게 설명하여라.

Text Classification
Sentiment Analysis
Binary Classification
Input Layer
Hidden Layer
Output Layer
Dense Layer
Neuron
Weight
Bias
ReLU
Sigmoid
Binary Cross-Entropy
Optimizer
Forward Propagation
Backpropagation
Epoch
Batch Size
Learning Rate
Overfitting
Generalization

본 모델과 연결하여 설명하여라.

입력노드: 10,000개
은닉층 1: 16개 노드
은닉층 2: 16개 노드
출력층: 1개 노드
출력값: 긍정일 확률
0에 가까움: 부정 가능성 높음
1에 가까움: 긍정 가능성 높음
0.5 부근: 판단 불확실

────────────────────────────────────
11. ReLU와 비선형성
────────────────────────────────────

ReLU를 다음과 같이 설명하여라.

ReLU(x) = max(0, x)

다음을 설명하여라.

입력이 음수이면 0
입력이 양수이면 그대로 출력
비선형성 제공
여러 Dense 층을 쌓는 의미를 만들어 줌

활성화 함수가 없으면 Dense 층은 다음 선형연산만 수행한다.

output = dot(W, input) + b

선형층을 여러 개 연결해도 전체적으로 하나의 선형변환과 같아질 수 있으므로
깊은 구조의 장점을 살리려면 비선형 활성화 함수가 필요하다고 설명하여라.

────────────────────────────────────
12. Sigmoid 출력층
────────────────────────────────────

Sigmoid:

sigmoid(x) = 1 / (1 + exp(-x))

출력범위:

0 < output < 1

해석:

출력값은 긍정일 예측확률
기본 임계값 0.5
0.5 이상이면 긍정
0.5 미만이면 부정

예:

긍정확률	해석
0.99	긍정 확신이 매우 높음
0.80	긍정 가능성이 높음
0.55	긍정으로 판단하지만 불확실
0.45	부정으로 판단하지만 불확실
0.10	부정 가능성이 높음
0.01	부정 확신이 매우 높음

────────────────────────────────────
13. 기본 DNN 구축
────────────────────────────────────

최신 Keras 문법을 사용하여라.

model = keras.Sequential([
    keras.Input(shape=(10000,)),
    layers.Dense(16, activation="relu"),
    layers.Dense(16, activation="relu"),
    layers.Dense(1, activation="sigmoid")
])

다음을 출력하여라.

model.summary()
각 층의 입력 shape
각 층의 출력 shape
층별 파라미터 수
전체 파라미터 수
학습 가능한 파라미터 수

파라미터 수를 직접 계산하여라.

첫 번째 Dense:

10000 × 16 + 16

두 번째 Dense:

16 × 16 + 16

출력 Dense:

16 × 1 + 1

model.summary()와 일치하는지 확인하여라.

────────────────────────────────────
14. 손실함수와 Optimizer
────────────────────────────────────

다음과 같이 컴파일하여라.

model.compile(
    optimizer="rmsprop",
    loss="binary_crossentropy",
    metrics=["accuracy"]
)

Binary Cross-Entropy가 이진분류에 적절한 이유를 설명하여라.

실제값 0 또는 1
예측값 0~1 확률
잘못된 확신에 큰 패널티
Sigmoid 출력층과 자연스럽게 연결

MSE도 계산상 사용할 수 있지만,
이진분류에서는 Binary Cross-Entropy가 일반적으로 더 적절하다고 설명하여라.

Optimizer 명칭은 RMSprop이라고 정확히 표시하여라.

────────────────────────────────────
15. 기본모형 학습
────────────────────────────────────

교재 재현을 위해 다음 조건으로 실제 학습하여라.

Epoch = 20
Batch size = 512
Validation data 사용
history = model.fit(
    partial_x_train,
    partial_y_train,
    epochs=20,
    batch_size=512,
    validation_data=(x_val, y_val),
    verbose=1
)

다음을 실제 출력하여라.

Epoch별 Train Loss
Epoch별 Validation Loss
Epoch별 Train Accuracy
Epoch별 Validation Accuracy
전체 학습시간
Epoch당 평균 학습시간

실제 실행값을 표로 정리하여라.

Epoch	Train Loss	Valid Loss	Train Acc	Valid Acc

────────────────────────────────────
16. 학습곡선 시각화
────────────────────────────────────

다음 그래프를 각각 작성하여라.

Training Loss와 Validation Loss
Training Accuracy와 Validation Accuracy

Loss 그래프:

history_dict = history.history

loss = history_dict["loss"]
val_loss = history_dict["val_loss"]

epochs = range(1, len(loss) + 1)

plt.figure(figsize=(8, 5))
plt.plot(epochs, loss, marker="o", label="Training loss")
plt.plot(epochs, val_loss, label="Validation loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.title("Training and Validation Loss")
plt.legend()
plt.show()

Accuracy 그래프도 같은 방식으로 작성하여라.

다음을 해석하여라.

훈련손실은 계속 감소하는가?
검증손실의 최솟값은 몇 번째 Epoch인가?
훈련정확도는 계속 증가하는가?
검증정확도의 최고점은 몇 번째 Epoch인가?
검증손실과 정확도가 악화되는 시점은 언제인가?

────────────────────────────────────
17. 과적합 진단
────────────────────────────────────

다음 기준으로 과적합을 판단하여라.

Train Loss는 감소
Validation Loss는 감소하다가 다시 증가
Train Accuracy는 증가
Validation Accuracy는 정체 또는 하락
Train과 Validation의 성능차이가 확대

다음을 실제 결과로 산출하여라.

최소 Validation Loss Epoch
최대 Validation Accuracy Epoch
마지막 Epoch의 Train–Validation Accuracy 차이
마지막 Epoch의 Validation Loss 증가량

첨부 교재에서는 약 4번째 Epoch 이후 과적합이 나타난 사례를 제시하지만,
현재 실행결과가 다르면 실제 결과를 기준으로 설명하여라.

────────────────────────────────────
18. Early Stopping
────────────────────────────────────

다음 Callback을 적용하여 별도 모델을 학습하여라.

early_stopping = keras.callbacks.EarlyStopping(
    monitor="val_loss",
    patience=2,
    restore_best_weights=True
)

최대 Epoch:

30

다음을 출력하여라.

실제 학습 Epoch 수
최적 Epoch
최저 Validation Loss
최종 Validation Accuracy
조기종료 여부

기본 20 Epoch 모델과 비교하여라.

────────────────────────────────────
19. 교재 재현용 최적 Epoch 재학습
────────────────────────────────────

검증손실이 최소인 Epoch를 기준으로
새로운 모델을 처음부터 다시 생성하여라.

중요:

기존 모델을 이어서 학습하지 마라.
새로운 무작위 초기화에서 다시 학습하여라.
전체 원래 훈련자료 25,000개를 사용하여라.
시험자료는 사용하지 마라.

예:

best_epoch = int(np.argmin(history.history["val_loss"]) + 1)

final_model = keras.Sequential([
    keras.Input(shape=(10000,)),
    layers.Dense(16, activation="relu"),
    layers.Dense(16, activation="relu"),
    layers.Dense(1, activation="sigmoid")
])

final_model.compile(
    optimizer="rmsprop",
    loss="binary_crossentropy",
    metrics=["accuracy"]
)

final_model.fit(
    x_train,
    y_train,
    epochs=best_epoch,
    batch_size=512,
    verbose=1
)

첨부 교재처럼 최적 Epoch가 4이면 4 Epoch로 학습하되,
실제 실행결과가 다르면 실제 최적 Epoch를 사용하여라.

────────────────────────────────────
20. 시험자료 최종평가
────────────────────────────────────

시험자료는 모델선정 후 한 번 평가하여라.

test_loss, test_accuracy = final_model.evaluate(
    x_test,
    y_test,
    verbose=0
)

다음을 출력하여라.

Test Loss
Test Accuracy
최종 Epoch
Validation 기반 선택근거

첨부 교재의 과거 결과 약 88.2%를 그대로 사용하지 말고
현재 실행환경의 실제 결과를 제시하여라.

────────────────────────────────────
21. 시험자료 예측확률
────────────────────────────────────

다음을 실행하여라.

test_prob = final_model.predict(
    x_test,
    batch_size=512
).reshape(-1)

test_pred = (test_prob >= 0.5).astype(int)

다음을 실제 출력하여라.

예측확률 shape
최솟값
최댓값
평균
중앙값
0.5 이상 비율
예측 긍정 수
예측 부정 수

다음 표를 작성하여라.

실제값	긍정확률	예측값	정오

시험자료 앞부분 20개를 제시하여라.

────────────────────────────────────
22. 혼동행렬
────────────────────────────────────

다음 방향으로 혼동행렬을 작성하여라.

행: 실제값
열: 예측값
실제＼예측	부정(0)	긍정(1)
부정(0)	TN	FP
긍정(1)	FN	TP

다음을 실제 계산하여라.

TN
FP
FN
TP

혼동행렬을 Heatmap으로 시각화하여라.

Accuracy가 혼동행렬 대각합과 일치하는지 확인하여라.

────────────────────────────────────
23. 분류성능 평가
────────────────────────────────────

다음 지표를 실제 계산하여라.

Accuracy
Error Rate
Sensitivity 또는 Recall
Specificity
Precision
Negative Predictive Value
F1-score
Balanced Accuracy
MCC
Cohen’s Kappa
False Positive Rate
False Negative Rate
Log Loss
Brier Score

공식:

Recall = TP / (TP + FN)
Specificity = TN / (TN + FP)
Precision = TP / (TP + FP)
F1 = 2 × Precision × Recall / (Precision + Recall)

긍정과 부정 데이터가 균형적이더라도
Accuracy 외 지표를 함께 확인하는 이유를 설명하여라.

────────────────────────────────────
24. ROC Curve와 ROC-AUC
────────────────────────────────────

긍정 예측확률을 이용하여 ROC Curve를 작성하여라.

다음을 계산하여라.

FPR
TPR
Threshold
ROC-AUC
Youden’s J 최대 임계값

그래프에는 다음을 포함하여라.

ROC Curve
무작위 기준선
AUC
기본 임계값 0.5
Youden’s J 최적 임계값

시험자료를 이용해 임계값을 최적화할 경우
이는 탐색적 분석임을 명시하고,
실제 운영에서는 별도 검증자료에서 임계값을 결정해야 한다고 설명하여라.

────────────────────────────────────
25. Precision-Recall Curve
────────────────────────────────────

다음을 계산하여라.

Precision
Recall
Average Precision
PR-AUC
양성 클래스 기본비율

PR Curve를 작성하여라.

IMDB는 클래스가 균형적이므로 ROC-AUC와 Accuracy가 유용하지만,
실제 불균형 텍스트 분류에서는 PR-AUC가 더 중요할 수 있음을 설명하여라.

────────────────────────────────────
26. 임계값 분석
────────────────────────────────────

검증자료 예측확률을 이용하여
0.05부터 0.95까지 임계값별 성능을 비교하여라.

각 임계값에서 다음을 계산하여라.

Accuracy
Recall
Specificity
Precision
F1
Balanced Accuracy
Youden’s J
FP
FN

다음 임계값을 제시하여라.

F1 최대
Balanced Accuracy 최대
Youden’s J 최대
기본 임계값 0.5

시험자료 최종평가에서는 검증자료에서 선택한 임계값을 사용하여라.

────────────────────────────────────
27. 오분류 리뷰 분석
────────────────────────────────────

오분류된 시험 리뷰를 추출하여라.

각 리뷰에 대해 다음을 포함하여라.

실제 레이블
예측 레이블
긍정확률
디코딩된 리뷰 일부
오류유형

다음 표를 작성하여라.

실제	예측	긍정확률	오류유형	리뷰 일부

다음 유형을 각각 제시하여라.

높은 확률로 잘못 분류된 긍정 리뷰
높은 확률로 잘못 분류된 부정 리뷰
0.5 근처의 불확실한 오분류 리뷰
매우 긴 오분류 리뷰
매우 짧은 오분류 리뷰

리뷰 전체가 너무 길면 앞부분만 제시하고
전체 길이도 함께 표시하여라.

────────────────────────────────────
28. 예측 불확실성
────────────────────────────────────

다음 지표를 계산하여라.

최대 확률
0.5와의 거리
Binary Entropy

Binary Entropy:

H(p) = -p log(p) - (1-p) log(1-p)

다음 유형을 추출하여라.

확신이 높은 정답
확신이 낮은 정답
확신이 높은 오답
확신이 낮은 오답

예측확률이 0.5에 가까울수록
모델의 판단이 불확실하다고 설명하여라.

────────────────────────────────────
29. 리뷰 길이와 오분류 관계
────────────────────────────────────

리뷰 길이와 예측오류의 관계를 분석하여라.

다음을 비교하여라.

정분류 리뷰 평균 길이
오분류 리뷰 평균 길이
긍정 오분류 리뷰 길이
부정 오분류 리뷰 길이

다음 그래프를 작성하여라.

정분류·오분류 리뷰 길이 Boxplot
리뷰 길이 구간별 Accuracy
리뷰 길이 구간별 평균 예측확률

리뷰 길이가 오류의 직접 원인이라고 단정하지 마라.

────────────────────────────────────
30. 은닉층 구조 비교
────────────────────────────────────

다음 구조를 동일한 조건에서 비교하여라.

Dense 8
Dense 16
Dense 32
Dense 64
Dense 16 → Dense 16
Dense 32 → Dense 16
Dense 64 → Dense 32 → Dense 16

각 구조에서 다음을 비교하여라.

파라미터 수
최저 Validation Loss
최고 Validation Accuracy
Test Accuracy
Test F1
ROC-AUC
학습시간
과적합 정도

다음 표를 작성하여라.

구조	Params	Valid Loss	Valid Acc	Test Acc	F1	Time

성능 차이가 작으면 더 단순한 구조를 선택하여라.

────────────────────────────────────
31. Dropout 비교
────────────────────────────────────

다음 Dropout을 비교하여라.

0.0
0.2
0.3
0.5

예:

dropout_model = keras.Sequential([
    keras.Input(shape=(10000,)),
    layers.Dense(16, activation="relu"),
    layers.Dropout(0.3),
    layers.Dense(16, activation="relu"),
    layers.Dropout(0.3),
    layers.Dense(1, activation="sigmoid")
])

다음을 비교하여라.

Train Accuracy
Validation Accuracy
Test Accuracy
Validation Loss
일반화 차이
과적합 시작 Epoch

Dropout은 훈련 정확도를 낮추더라도
검증·시험성능을 개선할 수 있음을 설명하여라.

────────────────────────────────────
32. L2 정규화
────────────────────────────────────

다음 L2 계수를 비교하여라.

0
0.0001
0.001
0.01
0.1

예:

from tensorflow.keras import regularizers

layers.Dense(
    16,
    activation="relu",
    kernel_regularizer=regularizers.l2(0.001)
)

다음을 비교하여라.

Train Loss
Validation Loss
Test Accuracy
Test F1
과적합 감소 여부

L2는 큰 가중치에 패널티를 주어
모델 복잡도를 억제한다고 설명하여라.

────────────────────────────────────
33. Batch size 비교
────────────────────────────────────

다음 Batch size를 비교하여라.

64
128
256
512
1,024

동일한 모델과 Epoch를 사용하여라.

다음을 비교하여라.

Steps per Epoch
학습시간
Validation Loss
Validation Accuracy
Test Accuracy

다음 표를 작성하여라.

Batch	Steps/Epoch	Time	Valid Loss	Test Acc

────────────────────────────────────
34. Optimizer 비교
────────────────────────────────────

다음 Optimizer를 비교하여라.

SGD
RMSprop
Adam

동일한 구조, Batch size 및 Epoch를 사용하여라.

다음을 비교하여라.

수렴속도
최저 Validation Loss
최고 Validation Accuracy
Test Accuracy
학습시간

다음 표를 작성하여라.

Optimizer	Valid Loss	Valid Acc	Test Acc	Time

────────────────────────────────────
35. Learning rate 비교
────────────────────────────────────

Adam 또는 RMSprop을 고정하고
다음 학습률을 비교하여라.

0.0001
0.001
0.01
0.1

다음을 확인하여라.

손실 감소속도
손실 진동
발산 여부
최저 Validation Loss
Test Accuracy

학습률이 너무 작으면 학습이 느리고,
너무 크면 손실이 진동하거나 발산할 수 있다고 설명하여라.

────────────────────────────────────
36. 입력 단어 수 비교
────────────────────────────────────

num_words 값을 다음과 같이 비교하여라.

1,000
5,000
10,000
20,000

각 설정에 대해 데이터를 다시 불러오고
입력차원을 맞추어 모델을 학습하여라.

다음을 비교하여라.

입력차원
파라미터 수
메모리 사용량
학습시간
Validation Accuracy
Test Accuracy
Test F1

단어 수가 많다고 반드시 성능이 증가하지 않으며,
희귀 단어와 노이즈가 추가될 수 있음을 설명하여라.

────────────────────────────────────
37. TF-IDF 기준모형
────────────────────────────────────

가능하면 멀티-핫 Binary Bag-of-Words와
TF-IDF 표현을 비교하여라.

TF-IDF에서는 다음 기준모형을 사용하여라.

Logistic Regression
Linear SVM

다음 표를 작성하여라.

입력표현	모형	Accuracy	F1	ROC-AUC
Multi-hot	DNN			
TF-IDF	Logistic Regression			
TF-IDF	Linear SVM			

DNN이 항상 가장 우수하다고 가정하지 마라.

────────────────────────────────────
38. Embedding 기반 모델
────────────────────────────────────

멀티-핫 방식과 비교하기 위해
정수 시퀀스 기반 Embedding 모델을 구축하여라.

먼저 리뷰를 동일 길이로 Padding하여라.

from tensorflow.keras.utils import pad_sequences

maxlen = 500

x_train_seq = pad_sequences(
    train_data,
    maxlen=maxlen
)

x_test_seq = pad_sequences(
    test_data,
    maxlen=maxlen
)

기본 Embedding 모델:

embedding_model = keras.Sequential([
    keras.Input(shape=(maxlen,)),
    layers.Embedding(
        input_dim=10000,
        output_dim=32
    ),
    layers.GlobalAveragePooling1D(),
    layers.Dense(16, activation="relu"),
    layers.Dense(1, activation="sigmoid")
])

다음을 설명하여라.

단어 인덱스를 밀집벡터로 변환
단어 간 의미적 관계를 학습 가능
10,000차원 희소벡터보다 메모리 효율적
GlobalAveragePooling은 순서정보를 완전하게 활용하지는 못함

────────────────────────────────────
39. Bag-of-Words와 Embedding 비교
────────────────────────────────────

다음 표를 작성하여라.

항목	Multi-hot DNN	Embedding DNN
입력형태	10,000차원 이진벡터	정수 시퀀스
희소성	높음	낮음
단어 순서	사용하지 않음	Padding 후 일부 구조 유지
의미표현	제한적	단어 임베딩 학습
파라미터 수		
Test Accuracy		
F1		
ROC-AUC		
학습시간		

성능 차이와 구조적 장단점을 설명하여라.

────────────────────────────────────
40. 순서정보 활용 모델 확장
────────────────────────────────────

가능하면 다음 중 하나를 확장실습으로 수행하여라.

1D CNN
SimpleRNN
LSTM
GRU

예: 1D CNN

cnn_text_model = keras.Sequential([
    keras.Input(shape=(maxlen,)),
    layers.Embedding(10000, 64),
    layers.Conv1D(64, 5, activation="relu"),
    layers.GlobalMaxPooling1D(),
    layers.Dense(16, activation="relu"),
    layers.Dense(1, activation="sigmoid")
])

기본 멀티-핫 DNN과 비교하여라.

단, 수업시간과 실행환경을 고려하여
확장모델은 선택사항으로 명확히 구분하여라.

────────────────────────────────────
41. 새로운 영어 리뷰 예측
────────────────────────────────────

사용자가 입력한 새로운 영어 리뷰의 긍정확률을 예측하여라.

예:

This movie was exciting, emotional, and beautifully acted.

다음 과정을 수행하여라.

소문자 변환
기본적인 토큰화
word_index를 이용해 정수 인덱스 변환
상위 10,000개 단어만 유지
특수 인덱스 보정
멀티-핫 벡터화
예측확률 산출
임계값 적용

다음을 출력하여라.

리뷰	긍정확률	예측감성	확실성

주의:

keras IMDB 데이터셋의 전처리규칙과 완전히 동일하게 외부 문장을 변환하기 어려울 수 있다.
구두점·축약어·미등록 단어 처리에 따라 결과가 달라질 수 있다.
외부 리뷰 예측은 시범적 결과로 해석하여라.

────────────────────────────────────
42. 최종 모델 선정
────────────────────────────────────

다음 후보를 비교하여라.

교재 기본 DNN
Early Stopping DNN
Dropout DNN
L2 DNN
최적 은닉층 구조
Embedding DNN
가능하면 1D CNN
TF-IDF Logistic Regression

다음 표를 작성하여라.

모델	Params	Valid Loss	Test Acc	F1	ROC-AUC	Time

다음을 종합하여 최종모델을 선정하여라.

Validation Loss
Validation Accuracy
Test Accuracy
F1
ROC-AUC
과적합 정도
파라미터 수
학습시간
해석 가능성
구조의 단순성

성능 차이가 미미하면
더 단순하고 안정적인 모델을 선택하여라.

────────────────────────────────────
43. 분석의 한계
────────────────────────────────────

다음을 실제 결과와 연결하여 설명하여라.

IMDB 데이터는 영어 리뷰임
상위 10,000개 단어만 사용함
멀티-핫 방식은 단어 순서를 잃음
반복 단어의 빈도를 반영하지 않음
부정어와 문맥을 충분히 이해하지 못할 수 있음
미등록 단어는 정보손실을 일으킴
영화 장르와 시점 차이가 반영되지 않을 수 있음
외부 리뷰의 전처리방식이 다르면 성능이 낮아질 수 있음
예측확률이 실제 감성강도와 일치하지 않을 수 있음
긍정·부정 이분법은 복합감정을 충분히 표현하지 못함
시험자료를 반복적으로 확인하면 사실상 검증자료로 사용될 수 있음
결과는 영어 텍스트 감성분류 교육용 모형임

────────────────────────────────────
44. 결과파일 저장
────────────────────────────────────

다음 CSV 파일을 생성하여라.

imdb_data_summary.csv
imdb_class_distribution.csv
imdb_review_length_statistics.csv
imdb_training_history.csv
imdb_test_predictions.csv
imdb_confusion_matrix.csv
imdb_classification_metrics.csv
imdb_threshold_analysis.csv
imdb_misclassified_reviews.csv
imdb_uncertain_reviews.csv
imdb_architecture_comparison.csv
imdb_dropout_comparison.csv
imdb_l2_comparison.csv
imdb_optimizer_comparison.csv
imdb_batch_comparison.csv
imdb_vocabulary_comparison.csv
imdb_model_comparison.csv
imdb_new_review_predictions.csv
imdb_final_results.csv

다음 Excel 파일을 생성하여라.

imdb_sentiment_analysis_results.xlsx

Excel Sheet:

Data_Summary
Class_Distribution
Review_Length
Training_History
Test_Predictions
Confusion_Matrix
Classification_Metrics
Threshold_Analysis
Misclassified_Reviews
Uncertain_Reviews
Architecture_Comparison
Dropout_Comparison
L2_Comparison
Optimizer_Comparison
Batch_Comparison
Vocabulary_Comparison
Model_Comparison
New_Review_Predictions
Final_Results

다음 PNG 파일을 생성하여라.

imdb_class_distribution.png
imdb_review_length_distribution.png
imdb_review_length_boxplot.png
imdb_dnn_architecture.png
imdb_training_validation_loss.png
imdb_training_validation_accuracy.png
imdb_confusion_matrix.png
imdb_roc_curve.png
imdb_pr_curve.png
imdb_threshold_analysis.png
imdb_prediction_probability_distribution.png
imdb_review_length_error.png
imdb_architecture_comparison.png
imdb_dropout_comparison.png
imdb_l2_comparison.png
imdb_optimizer_comparison.png
imdb_vocabulary_comparison.png
imdb_model_comparison.png

저장 후 파일이 실제로 생성되었는지 확인하여라.

────────────────────────────────────
45. 단계별 Python 코딩
────────────────────────────────────

코드는 다음 단계로 구분하여 작성하여라.

[코딩 1단계] 실행환경과 라이브러리 확인
[코딩 2단계] 난수 seed 설정
[코딩 3단계] IMDB 데이터 불러오기
[코딩 4단계] 데이터 구조와 클래스 확인
[코딩 5단계] 리뷰 길이 분석
[코딩 6단계] 정수 리뷰를 영어 문장으로 복원
[코딩 7단계] 멀티-핫 벡터화
[코딩 8단계] 벡터 희소도와 메모리 확인
[코딩 9단계] 훈련·검증·시험자료 구성
[코딩 10단계] DNN 이진분류 개념 설명
[코딩 11단계] 기본 DNN 구축
[코딩 12단계] 모델 구조와 파라미터 수 확인
[코딩 13단계] Binary Cross-Entropy와 RMSprop 설정
[코딩 14단계] 20 Epoch 기본모형 학습
[코딩 15단계] Training·Validation Loss
[코딩 16단계] Training·Validation Accuracy
[코딩 17단계] 과적합 시점 분석
[코딩 18단계] Early Stopping
[코딩 19단계] 최적 Epoch 재학습
[코딩 20단계] 시험자료 최종평가
[코딩 21단계] 예측확률과 클래스 산출
[코딩 22단계] 혼동행렬
[코딩 23단계] Accuracy·Precision·Recall·Specificity·F1
[코딩 24단계] ROC Curve와 ROC-AUC
[코딩 25단계] PR Curve와 PR-AUC
[코딩 26단계] 임계값 분석
[코딩 27단계] 오분류 리뷰 분석
[코딩 28단계] 예측 불확실성
[코딩 29단계] 리뷰 길이와 오류 관계
[코딩 30단계] 은닉층 구조 비교
[코딩 31단계] Dropout 비교
[코딩 32단계] L2 정규화 비교
[코딩 33단계] Batch size 비교
[코딩 34단계] Optimizer 비교
[코딩 35단계] Learning rate 비교
[코딩 36단계] 단어 수 비교
[코딩 37단계] TF-IDF 기준모형
[코딩 38단계] Embedding 모델
[코딩 39단계] Bag-of-Words와 Embedding 비교
[코딩 40단계] 1D CNN 또는 LSTM 확장
[코딩 41단계] 새로운 리뷰 예측
[코딩 42단계] 최종모델 선정
[코딩 43단계] 결과 저장

각 단계에서는 반드시 다음 순서를 지켜라.

무엇을 하는 단계인가?
왜 필요한가?
Python 코드
Python 실제 실행결과
결과 해석
다음 단계와의 연결

모든 단계가 끝난 후
처음부터 끝까지 한 번에 실행 가능한
전체 통합 Python 코드를 다시 제시하여라.

────────────────────────────────────
46. Python 코드 작성 원칙
────────────────────────────────────

기본 라이브러리:

tensorflow
keras
numpy
pandas
matplotlib
scikit-learn
scipy
openpyxl

핵심 클래스와 함수:

keras.Sequential
keras.Input
layers.Dense
layers.Dropout
layers.Embedding
layers.GlobalAveragePooling1D
layers.Conv1D
layers.GlobalMaxPooling1D
EarlyStopping
ReduceLROnPlateau
confusion_matrix
classification_report
roc_curve
roc_auc_score
precision_recall_curve
average_precision_score
log_loss
brier_score_loss
train_test_split
LogisticRegression
TfidfVectorizer

주요 코드에는 한국어 주석을 작성하여라.

그래프는 matplotlib 중심으로 작성하여라.

한글 폰트가 없으면 영문 제목을 사용하고,
폰트 문제로 분석을 중단하지 마라.

────────────────────────────────────
47. 오류 발생 시 처리
────────────────────────────────────

다음 오류가 발생하면 오류 메시지만 제시하고 종료하지 마라.

TensorFlow 설치 오류
IMDB 다운로드 오류
메모리 부족
10,000차원 벡터 생성 오류
입력 shape 오류
Label shape 오류
Loss와 출력층 불일치
NaN Loss
학습 발산
predict shape 오류
리뷰 디코딩 오류
외부 리뷰 인코딩 오류
Embedding 입력 오류
Excel 저장 오류
한글 폰트 오류

다음 대안을 검토하여 수정한 뒤 다시 실행하여라.

Batch size 감소
단어 수 감소
float32 사용
Sparse Matrix 또는 generator 검토
모델 크기 축소
Learning rate 감소
Epoch 감소
입력 shape 수정
Sigmoid와 Binary Cross-Entropy 일치
GPU 대신 CPU 사용

수정내용과 이유를 학생이 이해할 수 있도록 설명하여라.

────────────────────────────────────
48. 결과 검증
────────────────────────────────────

최종 결과 전에 다음을 확인하여라.

훈련 리뷰가 25,000개인가?
시험 리뷰가 25,000개인가?
클래스가 0과 1인가?
긍정·부정 비율이 균형적인가?
가장 큰 단어 인덱스가 9,999 이하인가?
멀티-핫 벡터 shape가 올바른가?
입력값이 0과 1인가?
레이블 자료형이 float32인가?
시험자료가 모델선정에 사용되지 않았는가?
검증자료가 별도로 존재하는가?
출력층이 Dense(1, sigmoid)인가?
손실함수가 binary_crossentropy인가?
예측확률 범위가 0~1인가?
혼동행렬의 행은 실제, 열은 예측인가?
Accuracy가 혼동행렬 대각합과 일치하는가?
ROC-AUC가 예측확률로 계산되었는가?
최적 Epoch가 검증자료로 선택되었는가?
과적합 판단이 학습곡선에 근거하는가?
오분류 리뷰의 실제 레이블과 예측 레이블이 정확한가?
외부 리뷰가 학습자료와 유사한 방식으로 전처리되었는가?
저장파일이 실제로 생성되었는가?

문제가 있으면 수정한 뒤 다시 실행하여라.

────────────────────────────────────
49. 최종 답변 출력 순서
────────────────────────────────────

최종 답변은 반드시 다음 순서로 작성하여라.

① 분석 목적
② 첨부 교재의 기본구조
③ 실행환경 확인
④ IMDB 데이터 구조
⑤ 긍정·부정 클래스 분포
⑥ 리뷰 길이 분석
⑦ 정수 리뷰의 영어 문장 복원
⑧ 멀티-핫 벡터화
⑨ Binary Bag-of-Words의 장단점
⑩ 훈련·검증·시험자료 구성
⑪ DNN 이진분류 원리
⑫ ReLU와 Sigmoid
⑬ 기본 DNN 구조
⑭ 모델 파라미터 수
⑮ Binary Cross-Entropy와 RMSprop
⑯ 기본모형 실제 학습
⑰ Training·Validation Loss
⑱ Training·Validation Accuracy
⑲ 과적합 시점
⑳ Early Stopping
㉑ 최적 Epoch 재학습
㉒ 시험 Loss와 Accuracy
㉓ 예측확률과 예측감성
㉔ 혼동행렬
㉕ Precision·Recall·Specificity·F1
㉖ ROC Curve와 ROC-AUC
㉗ PR Curve와 PR-AUC
㉘ 임계값 분석
㉙ 오분류 리뷰
㉚ 예측 불확실성
㉛ 리뷰 길이와 오분류
㉜ 은닉층 구조 비교
㉝ Dropout과 L2 정규화
㉞ Batch size·Optimizer·Learning rate
㉟ 단어 수 비교
㊱ TF-IDF 기준모형
㊲ Embedding 모델
㊳ Bag-of-Words와 Embedding 비교
㊴ 1D CNN 또는 LSTM 확장
㊵ 새로운 리뷰 예측
㊶ 최종모델 선정
㊷ 분석의 한계
㊸ 단계별 Python 코드
㊹ Python 실제 실행결과
㊺ 전체 통합 Python 코드
㊻ 생성된 CSV·Excel·PNG 파일

모든 수치, 표, 그래프 및 결론은
실제 Python 실행결과만을 사용하여라.

────────────────────────────────────
[사용자 입력정보]
────────────────────────────────────

[분석 목적 시작]

IMDB 영화 리뷰를 이용하여
영화 리뷰의 긍정·부정을 분류하는
완전연결 심층신경망을 구축하고 성능을 평가한다.

[분석 목적 끝]

[데이터 시작]

TensorFlow Keras IMDB 데이터 자동 불러오기

[데이터 끝]

[단어 수 시작]

num_words=10000

비교:
1000, 5000, 10000, 20000

[단어 수 끝]

[기본 모델 시작]

입력:
10,000차원 멀티-핫 벡터

은닉층 1:
Dense 16
activation=relu

은닉층 2:
Dense 16
activation=relu

출력층:
Dense 1
activation=sigmoid

Optimizer:
rmsprop

Loss:
binary_crossentropy

Epoch:
20

Batch size:
512

Seed:
42

[기본 모델 끝]

[검증자료 시작]

훈련자료 25,000개 중 10,000개
층화분할
random_state=42

[검증자료 끝]

[Early Stopping 시작]

monitor=val_loss
patience=2
restore_best_weights=True
최대 Epoch=30

[Early Stopping 끝]

[비교 DNN 구조 시작]

Dense 8
Dense 16
Dense 32
Dense 64
Dense 16 → Dense 16
Dense 32 → Dense 16
Dense 64 → Dense 32 → Dense 16

[비교 DNN 구조 끝]

[Dropout 시작]

0.0, 0.2, 0.3, 0.5

[Dropout 끝]

[L2 정규화 시작]

0, 0.0001, 0.001, 0.01, 0.1

[L2 정규화 끝]

[Batch size 시작]

64, 128, 256, 512, 1024

[Batch size 끝]

[Optimizer 시작]

SGD, RMSprop, Adam

[Optimizer 끝]

[Learning rate 시작]

0.0001, 0.001, 0.01, 0.1

[Learning rate 끝]

[Embedding 비교 시작]

Embedding dimension=32
maxlen=500
GlobalAveragePooling1D
Dense 16
Dense 1 sigmoid

[Embedding 비교 끝]

[평가지표 시작]

Test Loss
Accuracy
Precision
Recall
Specificity
F1-score
Balanced Accuracy
ROC-AUC
PR-AUC
MCC

[평가지표 끝]

[새로운 리뷰 시작]

예:

This movie was exciting, emotional, and beautifully acted.

새로운 리뷰가 없으면:
신규 리뷰 없음

[새로운 리뷰 끝]